/*(C) Copyright

    This file is part of GastosMovil.
    
    GastosMovil is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    GastosMovil is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with GastosMovil.  If not, see <http://www.gnu.org/licenses/>.
    
    Autor: Antonio Cristóbal Álvarez Abellán -> acabellan@gmail.com
    
    */

package deeloco.android.gastos.Movil.plus.broadcast;

import java.util.Date;

import deeloco.android.gastos.Movil.plus.GestorNotificaciones;
import deeloco.android.gastos.Movil.plus.Franja;
import deeloco.android.gastos.Movil.plus.FunGlobales;
import deeloco.android.gastos.Movil.plus.R;
import deeloco.android.gastos.Movil.plus.ValoresPreferencias;
import deeloco.android.gastos.Movil.plus.actualizarWidget;
import deeloco.android.gastos.Movil.plus.tarifa;
import deeloco.android.gastos.Movil.plus.tarifas;
import deeloco.android.gastos.Movil.plus.widgetProvider;
import deeloco.android.gastos.Movil.plus.widgetProvider1x1;

import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.os.Bundle;
import android.provider.CallLog;
import android.telephony.TelephonyManager;
import android.text.format.DateFormat;
import android.util.Log;
import android.appwidget.AppWidgetManager;
import android.widget.RemoteViews;

public class avisoEstadoTelefono extends  BroadcastReceiver {
	
	private static boolean llamadaSaliente = true;
	private tarifas ts=null;
	private tarifa t=null;
	private Franja f=null;
	public static String MY_WIDGET_UPDATE = "MY_OWN_WIDGET_UPDATE";
	public static final String PREFERENCIAS_WIDGET="MIS_PREFERENCIAS_WIDGET";
	public static final String PREF_NUMERO="NUMERO_ULTIMA";
	public static final String PREF_DURACION="DURACION_ULTIMA";
	public static final String PREF_FECHA="FECHA_ULTIMA";
	public static final String PREF_LLAMADA="LLAMADA_ULTIMA";
	public static final String PREF_NOMBRE="NOMBRE_ULTIMA";
	public static final String PREF_COSTE="COSTE_ULTIMA";
	Context contexto;

    @Override
    public void onReceive(Context context, Intent intent) {
    		contexto=context;
            Bundle bundle = intent.getExtras();
            if(null == bundle)
                    return;
            String state = bundle.getString(TelephonyManager.EXTRA_STATE);
            Log.d("avisoEstado","Estado"+state);
            if (TelephonyManager.EXTRA_STATE_RINGING.equals(state))
            {
            	Log.d("avisoEstado","Llamada entrante");
            	llamadaSaliente=false;
            	return;//Llamada entrante
            }
            	

            if(TelephonyManager.EXTRA_STATE_IDLE.equals(state))
            {
            	Log.d("avisoEstado","Fin de la llamada");
            	if (llamadaSaliente)
            	{
            		Log.d("avisoEstado","Procesamos la llamada");
            		//Actualizamos los datos almacenados en preferencias
            		actualizarDatosWidget(context);
            		
            		//Actualizamos los datos del widget en el interface
            		actualizarWidget aw= new actualizarWidget(context,R.layout.widget);
            		RemoteViews updateView = aw.buildUpdate();
            		ComponentName myComponentName = new ComponentName(context, widgetProvider.class);
            		AppWidgetManager manager = AppWidgetManager.getInstance(context);
            		manager.updateAppWidget(myComponentName, updateView);
            		
            		aw= new actualizarWidget(context,R.layout.widget1x1);
            		updateView = aw.buildUpdate();
            		myComponentName = new ComponentName(context, widgetProvider1x1.class);
            		manager = AppWidgetManager.getInstance(context);
            		manager.updateAppWidget(myComponentName, updateView);
            		
            	}
            	else
            	{
            		Log.d("avisoEstado","NO Procesamos la llamada");
            	}
            	llamadaSaliente=true;
            }
    }
        
        
        
        
   /**
    * Función que se encarga de actualizar los  en preferencias que se van a mostrar en el widget.
    * @param context
    * @return RemoteView
    * 	Vista remota con todos los elementos del widget actualizados.
    */
   private void actualizarDatosWidget(Context context) {
	   
       //RemoteViews updateView = null;
       ValoresPreferencias vp=new ValoresPreferencias(context);
       int totalRegistros=1;
       String fechaHora;
       double iva=(vp.getcosteConIVA())?vp.getPreferenciasImpuestos():1;
       double coste = 0.0;
       int duracion=0;
       long fecha=0;
       SharedPreferences preferencias = context.getSharedPreferences(PREFERENCIAS_WIDGET, Context.MODE_PRIVATE);
       String fechaLlamadaAnterior=vp.recuperarPreferencesString(avisoEstadoTelefono.PREF_FECHA);
       if (preferencias!=null)
       {
    	 
    	 //Cursor con el que recorreremos la base de datos de registros de llamadas para obtener los valores de la última llamada
    	   android.os.SystemClock.sleep(2000);
    	   	Cursor c;
    	   	c=context.getContentResolver().query(CallLog.Calls.CONTENT_URI,null, null , null, CallLog.Calls.DEFAULT_SORT_ORDER+ " LIMIT 1");
    	   	//indice de las Columnas de la consulta
    	   	int iDuracion = c.getColumnIndex(CallLog.Calls.DURATION);
	        int iTelefono = c.getColumnIndex(CallLog.Calls.NUMBER);
	        int iFecha = c.getColumnIndex(CallLog.Calls.DATE);
	        int iNombre = c.getColumnIndex(CallLog.Calls.CACHED_NAME);
    	   	c.moveToFirst();
    	   	//recogemos los valores
    	   	duracion=c.getInt(iDuracion);
    	   	String telefono=FunGlobales.quitarPrePais(c.getString(iTelefono));
    	   	fecha=c.getLong(iFecha);
    	   	String nombre=c.getString(iNombre);

    	   	if (duracion==0)
    	   	{
    	   		Log.i("GM:avisoEstadoTelefono","DURACION = 0. NO HACER NADA");
    	   		return; //Si la duración de la última llamada=0, no se hace nada.
    	   	}   	
	    	//c=context.getContentResolver().query(CallLog.Calls.CONTENT_URI,null, CallLog.Calls.DURATION+">1 and "+CallLog.Calls.TYPE+"="+CallLog.Calls.OUTGOING_TYPE , null, CallLog.Calls.DEFAULT_SORT_ORDER+ " LIMIT 1");
	        totalRegistros=c.getCount();
	        if (totalRegistros>0)
	        {
				duracion+=vp.getPreferenciasDuracion(); //le añadimos la modificación de la duración de la llamada;
		        fechaHora=DateFormat.format("dd/MM/yyyy kk:mm:ss",new Date(fecha)).toString();
		        //Calculamos el coste de la llamada
		        
		        //Hay que ver que tarifa y franja conrresponde a la llamada realizada
		        ts=new tarifas();
		        ts.cargarTarifas();
		        t=ts.getTarifa(telefono,fechaHora);
		        
		        if (t==null)
		        {
		        	//No hay ninguna tarifa para la llamada
		        	
		        }
		        else	
		        {
		        	f=t.getFranja(fechaHora);
		        }
		        
		        //Montamos la cadena donde se van a presentar los datos de la última llamada
		        if (f!=null&&t!=null)
		        {
		        	coste =f.coste(t, duracion)*(iva);
		        }
		        
	        }
	        else
	        {
	        	telefono="SIN DATOS";
				duracion=0; //le añadimos la modificación de la duración de la llamada;
		        fechaHora="SIN DATOS";
		        nombre="Gastos Móvil";
	        }
	        c.close();
	        //Guardamos en preferencias los valores de la última llamada
            vp.guardarPreferences(avisoEstadoTelefono.PREF_NUMERO,telefono);
            vp.guardarPreferences(avisoEstadoTelefono.PREF_FECHA, fechaHora);
            vp.guardarPreferences(avisoEstadoTelefono.PREF_DURACION, duracion);
            vp.guardarPreferences(avisoEstadoTelefono.PREF_NOMBRE, nombre);
            vp.guardarPreferences(avisoEstadoTelefono.PREF_COSTE, ""+FunGlobales.redondear(coste, 2));
            Log.i("avisoEstadoTeléfono","GUardadas preferencias de la última llamada");

       }

       //Recuperamos el valor guardado en preferencias de los totales mensuales para cada tarifa. 
       //Y le añadimos el coste de la llamada a la tarifa que corresponda
       //NOTIFICACIONES
       GestorNotificaciones notif=new GestorNotificaciones(contexto, 0);
       notif.comprobarNotificaciones();
       
	   	boolean diferentePeriodo=FunGlobales.diferentePeriodo(fechaLlamadaAnterior, fecha,vp.getPreferenciasInicioMes());
	   	//Si el mes de la llamada realizada es diferente al mes de la última llamada almacenada
	   	if (diferentePeriodo&&vp.getPreferenciasMesActual())
	   	{
	   		//La llamada se ha realizado en un periodo diferente al de la última llamada almacenada y en preferencias esta
	   		//seleccionado 'mes actual'
	   		guardarDatosMes(ts, coste, duracion, true);
	   		//Lanzar Notificación
//	   		GestorNotificaciones ag=new GestorNotificaciones(contexto,0);
	   		notif.lanzarNotificacion("Cambio de periodo", "Actualizar datos. Ver listado de llamadas");
	   		
	   	}
	   	else
	   	{
	   		Log.d("...","No diferentePeriodo="+diferentePeriodo);
	   		guardarDatosMes(ts, coste, duracion, false);
 			GestorNotificaciones alarma=new GestorNotificaciones(contexto, 0);
 			alarma.comprobarNotificaciones();
	   	}
   }
   
   /**
    *  Recuperamos el valor guardado en preferencias de los totales mensuales para cada tarifa. 
    *  Y le añadimos el coste de la llamada a la tarifa que corresponda
    * @param ts tarifa
    * @param coste double
    * @param duracion int
    * @param reset boolean
    */
   private void guardarDatosMes(tarifas ts,double coste, int duracion,boolean reset)
   {
	   ValoresPreferencias vp=new ValoresPreferencias(contexto);
	   
	   try
	   {
	
    	for (int i=0;i<ts.numTarifas();i++)
    	{
    		if (t.getIdentificador()==ts.getTarifas().get(i).getIdentificador())
    		{
    			//Tenemos que cargar el coste de la llamada a esta tarifa.
    			int segMes=0;
    			int segLimiteMes=0;
    			double costeMes=0.0;
    			double costeTotalMes=0.0;
    			if (!reset)
    			{
	    			segMes = vp.recuperarPreferencesInt(ts.getTarifas().get(i).getNombre()+"_segConsumidosMes");
	    			segLimiteMes = vp.recuperarPreferencesInt(ts.getTarifas().get(i).getNombre()+"_segConsumidosLimiteMes");
	    			//AQUI
	    			try
	    			{
	    				costeMes=Double.parseDouble(vp.recuperarPreferencesString(ts.getTarifas().get(i).getNombre()+"_costeMes"));
	    			}
	    			catch (Exception e)
	    			{
	    				costeMes=0.0;
	    			}
	    			
	    			try
	    			{
	    				costeTotalMes=Double.parseDouble(vp.recuperarPreferencesString("costeTotalMes"));
	    			}
	    			catch (Exception e)
	    			{
	    				costeTotalMes=0.0;
	    			}
	    			
    			}
    			
    			//Añadimos los costes de la llamada
    			costeTotalMes+=coste;
    			costeMes+=coste;
    			segMes+=duracion;
    			
    			if (f.getLimite())
    				segLimiteMes+=duracion;
    			
    			//GUardamos los datos
    			vp.guardarPreferences(ts.getTarifas().get(i).getNombre()+"_segConsumidosMes", segMes);
    			vp.guardarPreferences(ts.getTarifas().get(i).getNombre()+"_segConsumidosLimiteMes", segLimiteMes);
    			vp.guardarPreferences(ts.getTarifas().get(i).getNombre()+"_costeMes", ""+FunGlobales.redondear(costeMes,2));
    			vp.guardarPreferences("costeTotalMes", ""+FunGlobales.redondear(costeTotalMes, 2));
    			Log.i("avisoEstadoTeléfono","GUardadas preferencias de la tarifa "+ts.getTarifas().get(i).getNombre());
    			break;
    		}

    	}
	   }
	   catch (Exception e)
	   {
		   
	   }
   }

}
